package com.yc.blog.util;

import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.jsp.PageContext;

import com.jspsmart.upload.File;
import com.jspsmart.upload.Files;
import com.jspsmart.upload.Request;
import com.jspsmart.upload.SmartUpload;

/**
 * 文件上传的工具类
 * @author yy
 * date 2020年8月8日
 * QQ:1464080002
 */
public class FileUploadUtil {
	public static String PATH = "images"; //默认上传路劲
	private static final String ALLOWEDLIST = "gif,jpg,png,jpeg,doc,docx,xls,xlsx,txt,zip,rar,mp3,mp4"; // 允许上传的文件后缀
	private static final int MAXFILESIZE = 10 * 1024 * 1024;//上传的单个文件的最大大小
	private static final int TOTALMAXSIZE = 100 * 1024 * 1024; //每次上传的文件总大小
	
	/**
	 * 
	 * @param pageContext
	 * @return
	 * @throws Exception 
	 */
	public Map<String,String> upload(PageContext pageContext) throws Exception{
		Map<String,String> map = new HashMap<String,String>();
		
		//实例化上传组件
		SmartUpload su = new SmartUpload();
		
		//初始化上传组件
		su.initialize(pageContext);
		
		//设置上传的参数
		su.setMaxFileSize(MAXFILESIZE);
		su.setAllowedFilesList(ALLOWEDLIST);
		//su.setDeniedFilesList(s);不允许上传的文件后缀
		su.setTotalMaxFileSize(TOTALMAXSIZE);
		su.setCharset("utf-8");
		su.upload();//开始上传
		
		//获取非文件域参数
		Request req = su.getRequest();
		
		//获取所有的文本框的name属性的属性值
		@SuppressWarnings("unchecked")
		Enumeration<String> enums = req.getParameterNames();
		
		String name = null;
		while(enums.hasMoreElements()) {
			name = enums.nextElement();
			map.put(name, req.getParameter(name));
		}
		
		//处理要上传的文件
		Files files = su.getFiles(); // 获取所有要上传的文件
		if(files == null || files.getCount() <=0 || files.getSize() <=0 || files.getFile(0).getSize() <= 0) {
			return map; //则我们认为没有文件要处理
		}
		
		Collection<File> fls = files.getCollection();
		
		//获取Tomcat在服务器中的绝对路径
		String basePath = pageContext.getServletContext().getRealPath("/");
		
		String fileName = null; //上传后新的文件名
		String fieldName = null; //上传这个文件的文件域的name属性的属性值
		String filePath = null; //文件的保存路径
		String pathStr = "";
		String temp = null;
		for(File fl : fls) {
			if(!fl.isMissing()) { //说明没用丢失数据
				// 将这个文件数据存到服务器
				
				//为了避免文件名相同出现的文件覆盖，所以我们要对上传的文件重名名
				temp = fl.getFieldName();
				if(StringUtil.chekNUll(fieldName)) {
					fieldName = temp;
				}else {
					if(!temp.equals(fieldName)) { //说明此时第一个文件已经读完
						//将这个文件域的内容存到map中
						map.put(fieldName, pathStr);
						pathStr = ""; //初始化参数，准备存放下一个文件域中的内容
						fieldName = temp;
					}
				}	
				
				fieldName = fl.getFieldName();
				fileName = new Date().getTime() + "_" + fl.getFileName();
				
				//将这个文件存到服务器的指定目录中
				filePath = PATH + "/" + fileName; 
				
				// 将文件存到服务器
				fl.saveAs(basePath + filePath, SmartUpload.SAVE_PHYSICAL); 
				
				if(StringUtil.chekNUll(pathStr)) {
					pathStr = filePath;
				}else {
					pathStr += "," + filePath;
				}
			}
		}
		map.put(fieldName, pathStr);
		return map;
	}
}
